#ifndef NET_TCPSERVER_H
#define NET_TCPSERVER_H

#include <memory>
#include <functional>
#include <unordered_map>
#include "logger.h"
#include "event_loop.h"
#include "acceptor.h"
#include "connection.h"

namespace net {

/**
 * @brief TCP服务器类，管理所有连接和事件循环
 * 整合Acceptor、Connection和EventLoop，提供完整的TCP服务器功能
 */
class TcpServer 
{
public:
    /**
     * @brief 构造函数
     * @param port 监听端口
     */
    TcpServer(int port);

    /**
     * @brief 设置线程池大小
     * @param count 线程数量
     */
    void setThreadCount(int count);

    /**
     * @brief 设置连接建立回调
     * @param cb 回调函数
     */
    void setConnectedCallback(const std::function<void(const PtrConnection&)>& cb);

    /**
     * @brief 设置消息接收回调
     * @param cb 回调函数
     */
    void setMessageCallback(const std::function<void(const PtrConnection&, Buffer*)>& cb);

    /**
     * @brief 设置连接关闭回调
     * @param cb 回调函数
     */
    void setClosedCallback(const std::function<void(const PtrConnection&)>& cb);

    /**
     * @brief 设置任意事件回调
     * @param cb 回调函数
     */
    void setAnyEventCallback(const std::function<void(const PtrConnection&)>& cb);

    /**
     * @brief 启用非活跃连接超时释放
     * @param timeout 超时时间（秒）
     */
    void enableInactiveRelease(int timeout);

    /**
     * @brief 添加定时任务
     * @param task 任务函数
     * @param delay 延迟时间（毫秒）
     */
    void runAfter(const std::function<void()>& task, int delay);

    /**
     * @brief 启动服务器（阻塞当前线程）
     */
    void start();

private:
    // 内部类型定义
    using Functor = std::function<void()>;

    // 私有方法
    void runAfterInLoop(const Functor& task, int delay);
    void newConnection(int fd);
    void removeConnection(const PtrConnection& conn);
    void removeConnectionInLoop(const PtrConnection& conn);

private:
    uint64_t _nextId;                       // 下一个连接ID（自动递增）
    int _port;                              // 监听端口
    int _timeout;                           // 非活跃连接超时时间（秒）
    bool _enableInactiveRelease;            // 是否启用非活跃连接释放
    EventLoop _baseloop;                    // 主事件循环（处理监听套接字）
    Acceptor _acceptor;                     // 连接接受器
    LoopThreadPool _pool;                   // 事件循环线程池
    std::unordered_map<uint64_t, PtrConnection> _conns; // 连接管理器

    // 回调函数
    std::function<void(const PtrConnection&)> _connectedCallback; // 连接建立回调
    std::function<void(const PtrConnection&, Buffer*)> _messageCallback; // 消息接收回调
    std::function<void(const PtrConnection&)> _closedCallback; // 连接关闭回调
    std::function<void(const PtrConnection&)> _eventCallback; // 任意事件回调
};

} // namespace net

#endif // NET_TCPSERVER_H